# app/utils/logger.py
from loguru import logger
import sys
import os
from pathlib import Path

# 获取项目根目录（your_project_root/）
project_root = Path(__file__).resolve().parent.parent.parent

# 创建 logs 目录（如果不存在）
log_dir = project_root / "logs"
log_dir.mkdir(exist_ok=True, parents=True)

# 获取当前环境（假设通过 FLASK_ENV 环境变量设置）
ENV = os.getenv("FLASK_ENV", "dev")

# 删除 loguru 默认配置
logger.remove()

# 配置控制台输出（带颜色）
console_format = (
    "<green>{time:YYYY-MM-DD HH:mm:ss}</green> | "
    "<level>{level: <8}</level> | "
    "<cyan>{module}</cyan>.<cyan>{function}</cyan>:<cyan>{line}</cyan> - "
    "<level>{message}</level>"
)
logger.add(
    sys.stderr,
    format=console_format,
    level="DEBUG" if ENV == "dev" else "INFO",
    colorize=True
)


def clean_empty_logs(log_dir):
    """在应用启动时删除所有空日志文件"""
    file_num = 0
    for filename in os.listdir(log_dir):
        path = os.path.join(log_dir, filename)
        if os.path.isfile(path) and os.stat(path).st_size == 0:
            try:
                os.remove(path)
                file_num += 1
            except PermissionError :
                pass
    return file_num


file_num = clean_empty_logs(log_dir)
logger.info(f"清理空日志{file_num}个")

# 程序运行程序输出（按天轮转）
log_file = log_dir / "app_info_{time:YYYY-MM-DD}.log"
file_format = "{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {module}.{function}:{line} - {message}"
logger.add(
    log_file,
    rotation="00:00",  # 每天轮转
    retention="30 days",
    compression="zip",
    encoding="utf-8",
    format=file_format,
    filter=lambda record: record["level"].name in {"INFO", "WARNING"}
)

# 程序运行错误输出（按天轮转）
log_file = log_dir / "app_error_{time:YYYY-MM-DD}.log"
file_format = "{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {module}.{function}:{line} - {message}"
logger.add(
    log_file,
    rotation="00:00",  # 每天轮转
    retention="30 days",
    compression="zip",
    encoding="utf-8",
    format=file_format,
    level="ERROR",
    diagnose=False,  # 关闭变量值诊断
    backtrace=False,  # 去掉复杂信息，仅保留基础堆栈
)

# 所有INFO以上的信息JSON备份
log_file = log_dir / "app_json_{time:YYYY-MM-DD}.log"
logger.add(
    log_file,
    rotation="1024 MB",  # 内存轮转
    retention="30 days",
    compression="zip",
    encoding="utf-8",
    format=file_format,
    serialize=True,
    level="INFO"
)

# 导出 logger 实例
__all__ = ["logger"]

# @logger.catch
# logger.debug("调试信息（仅控制台可见）")
# logger.info("普通信息（仅控制台可见）")
# logger.warning("警告信息（控制台和文件都可见）")
# logger.error("错误信息")
